// var n;
// exports.EventMgr = void 0;
// var $logManager = require("./LogManager");
// var c = (function (e) {
//     function t() {
//         var t = (null !== e && e.apply(this, arguments)) || this;
//         t._target = new cc.EventTarget();
//         return t;
//     }
//     __extends(t, e);
//     t.prototype.addEventListener = function (e, t, o) {
//         if (e) {
//             return null == t
//                 ? ($logManager.LogMgr.warn("addEventListener callBack is nil"), !1)
//                 : (this._target.on(e, t, o), !0);
//         } else {
//             return $logManager.LogMgr.warn("eventName is empty" + e), !1;
//         }
//     };
//     t.prototype.addEventListenerOnce = function (e, t, o) {
//         if (e) {
//             return null == t
//                 ? ($logManager.LogMgr.warn("addEventListener callBack is nil"), !1)
//                 : (this._target.once(e, t, o), !0);
//         } else {
//             return $logManager.LogMgr.warn("eventName is empty" + e), !1;
//         }
//     };
//     t.prototype.cleanEventListener = function () {
//         this._target.clear();
//         return !0;
//     };
//     t.prototype.rmEventListener = function (e, t, o) {
//         this._target.off(e, t, o);
//     };
//     t.prototype.dispatchEvent = function (e) {
//         var t;
//         var o = [];
//         for (var n = 1; n < arguments.length; n++) {
//             o[n - 1] = arguments[n];
//         }
//         (t = this._target).emit.apply(t, __spreadArrays([e], o));
//     };
//     return t;
// })(require("./SingletonManager").SingletonMgr);
// exports.EventMgr = c.getInstance();
import { LogMgr } from "./LogManager";
import { SingletonBase } from "./SingletonManager";

/**
 * 事件管理类
 * 建议名称：EventManager
 */
class EventMgr extends SingletonBase {
    // CocosCreator中的cc.EventTarget节点，用于管理事件的注册与触发
    private _eventTarget: cc.EventTarget;

    constructor() {
        super();
        this._eventTarget = new cc.EventTarget();
    }

    /**
     * 添加事件监听器
     * @param eventName 事件名称
     * @param callback 回调函数
     * @param target 目标对象
     * @returns 是否成功添加监听器
     * 建议方法名：addListener
     */
    public addListener(eventName: string, callback: Function, target?: any): boolean {
        if (!eventName) {
            LogMgr.warn(`eventName is empty: ${eventName}`);
            return false;
        }
        if (callback == null) {
            LogMgr.warn("addEventListener callback is nil");
            return false;
        }
        this._eventTarget.on(eventName, callback, target);
        return true;
    }

    /**
     * 添加一次性事件监听器
     * @param eventName 事件名称
     * @param callback 回调函数
     * @param target 目标对象
     * @returns 是否成功添加监听器
     * 建议方法名：addListenerOnce
     */
    public addListenerOnce(eventName: string, callback: (arg1?: any, arg2?: any, arg3?: any, arg4?: any, arg5?: any) => void, target?: any): boolean {
        if (!eventName) {
            LogMgr.warn(`eventName is empty: ${eventName}`);
            return false;
        }
        if (callback == null) {
            LogMgr.warn("addEventListenerOnce callback is nil");
            return false;
        }
        this._eventTarget.once(eventName, callback, target);
        return true;
    }

    /**
     * 清除所有事件监听器
     * @returns 是否成功清除监听器
     * 建议方法名：clearListeners
     */
    public clearListeners(): boolean {
        this._eventTarget.clear();
        return true;
    }

    /**
     * 移除事件监听器
     * @param eventName 事件名称
     * @param callback 回调函数
     * @param target 目标对象
     * 建议方法名：removeListener
     */
    public removeListener(eventName: string, callback: Function, target?: any): void {
        this._eventTarget.off(eventName, callback, target);
    }

    /**
     * 派发事件
     * @param eventName 事件名称
     * @param args 事件参数
     * 建议方法名：emitEvent
     */
    public emitEvent(eventName: string, ...args: any[]): void {
        this._eventTarget.emit(eventName, ...args);
    }
}

export const EventMgrInstance = EventMgr.getInstance();

/**
 * 代码优化修改说明：
 * 1. 将私有变量 _target 更名为 _eventTarget 以更加清晰地表达其用途。
 * 2. 更改了字符串模板拼接方式，使日志信息更加清晰。
 * 3. 将重复的逻辑通过提前返回的方式优化代码结构，提高可读性。
 */